package reflect;


import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;

/**
 * java的反射机制
 * 反射是java的动态机制，允许程序在【运行期间】再确定如对象实例化，方法调用
 * 属性操作等。可以提高代码的灵活度，有良好的可扩展性，但是带来了较低的运行
 * 效率和较多的资源开销。适度使用。
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            反射的第一步，获取要操作的类的类对象
            java.lang.Class 类对象
            它的每一个实例用于表示一个被JVM加载的类。
            意味着JVM每加载一个类(读取对应类的.class文件)的同时会实例化
            一个Class实例与之绑定，并在该Class实例上记录加载的类的一切信息
            因此每个被加载的类都有且只有一个Class的实例与之对应，通过这个
            类对象就可以了解其表示的类的所有信息

            获取一个类对象的方式
            1.通过类名.class
               Class cls = String.class;//获取String的类对象
               Class cls2 = int.class;//基本类型也可以获取类对象

            2.Class.forName(String className)
              Class cls3 = Class.forName("java.lang.String");

            3.类加载器ClassLoader
            4.对象.getClass()
         */

        //获取String的类对象
//        Class cls = Map.class;
        // 通过指定类的完全限定名去获取一个类的类对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入类名");
        String name = sc.nextLine();

        Class cls = Class.forName(name);

        String className = cls.getName();
        // 获取全类名
        System.out.println(className);
        // 获取类名
        System.out.println(cls.getSimpleName());
        // 获取包名
        System.out.println(cls.getPackage());

        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

    }
}




